package com.doit.day06

import java.text.Bidi

object _09_视图限定 {
  def main(args: Array[String]): Unit = {

    //视图限定穿进去的类型有一个前提条件：可以通过隐式转换，将你穿进去的类型对象转换成Bird对象
    implicit def as(toyBird:ToyBird)={
      new Bird("玩具鸟")
    }


    implicit def aaa(a:Int)={
      new Bird("数字鸟")
    }

    implicit def aaa1(a:String)={
      new Bird("数字鸟")
    }

    //给他一些限制条件   视图限定的标志  <%
    //只要你加了视图限定，视图限定你必须得限定一个类，后面这个类型的对象就可以调用限定这个类中的所有方法
    def bitBird[T <% Bird](b:T)=b.fly()

    bitBird[Bird](new Bird("小鸟"))
    bitBird[String]("sss")

    //toyBird不可以传，不可以传的原因是什么呢？toyBird本身这个对象不能够调用bird这个类中的方法
    //现在如果说，让toyBird这个对象可以调用Bird中的方法   是不是就可以传呢？
    bitBird[ToyBird](new ToyBird)
    bitBird[Int](1)

    //视图限定是泛型和隐式转换的结合产物





   /* bitBird[Bird](new Bird("小鸟"))

    implicit def toy2Bird(toyBird: ToyBird)= new Bird("玩具鸟")

    bitBird[ToyBird](new ToyBird)*/
  }

}

class ToyBird /*extends Bird("abc")*/

class Bird(val name:String){
  def fly()={println(name + "飞走了")}

  def eat()={println("吃")}
}
